package test.匹配pmid图片相关;

import cn.hutool.core.collection.ConcurrentHashSet;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.db.ds.DSFactory;
import cn.hutool.db.ds.druid.DruidDSFactory;
import lombok.SneakyThrows;
import test.work.DownpMImage;
import utils.SmallTool;
import utils.StringUtil;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * @Author: gcr
 * @Date: 2022年5月26日09:00:08
 */
public class 批量根据pmid与服务器差异进行下载图片到本地 {
    @SneakyThrows
    public static void main(String[] args) {

        String rootPath = "G:\\pubmed\\";


        DSFactory.setCurrentDSFactory(new DruidDSFactory());
        DataSource ds = DSFactory.get("server_dao4");
        Db useServer = Db.use(ds);
        Db useLocal = Db.use();

        String server = "pubmed_temp.pmiddoidown_gcr";
        String localPm = "pubmed.pmiddoidown_gcr_local";
        String todownTable = "pubmed.to_down";

        useLocal.execute("truncate table " + todownTable);


        String sql = "select max(pmid) as count from " + localPm;
        Integer max = Integer.parseInt(useLocal.queryString(sql));
        StackTraceElement[] stackTrace = new Throwable().getStackTrace();
        String fileName = stackTrace[0].getFileName();
        SmallTool.printMess("开始了+++" + fileName.replace(".java", ""));
        int startStart = 1;
        int endEnd = max;
        if (startStart != 1) {
            startStart = startStart * DownpMImage.breakSize;
        }

        int breakSize = DownpMImage.breakSize;
        int page = max / breakSize + 1;
        SmallTool.printMess("最大值+++" + max);
        SmallTool.printMess("页码+++" + page);
        // status 初始化数据 0 是原始值 1 是成功 2是失败
        for (int i = 1; i <= page; i++) {
            int start = breakSize * (i - 1) + 1;
            //目前跑了一千多万了
            if (start < startStart) {
                continue;
            }
            int end = breakSize * i;
            if (end > endEnd) {
                continue;
            }
            SmallTool.printMess("开始页码+" + i + "+++" + start + "++++end+++" + end);
            String querySql = "select pmid,figure from " + localPm + " where pmid between " + start + " and " + end;
            String querySqlServer = "select pmid from " + server + " where pmid between " + start + " and " + end;
            List<Entity> query = useLocal.query(querySql);
            List<Entity> queryServer = useServer.query(querySqlServer);
            Map<Integer, String> localPmFi = new ConcurrentHashMap<>();
            Set<Integer> pmidLocal = new ConcurrentHashSet<>();
            Set<Integer> pmidServer;
            for (Entity entity : query) {
                String figure = entity.getStr("figure");
                if (StringUtil.isNotNull(figure) && !figure.equals("[]")) {
                    Integer pmid = entity.getInt("pmid");
                    pmidLocal.add(pmid);
                    localPmFi.put(pmid, figure);
                }
            }
            pmidServer = queryServer.stream().map(o -> o.getInt("pmid")).collect(Collectors.toSet());
            pmidLocal.removeAll(pmidServer);
            pmidLocal.parallelStream().forEach(o -> {
                Entity entity = new Entity();
                entity.setTableName(todownTable);
                entity.set("pmid", o);
                entity.set("figure", localPmFi.get(o));
                entity.set("status", 0);
                entity.set("isok", 0);
                try {
                    useLocal.insert(entity);
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            });

//            // 2021年10月16日09:39:30 还是太慢 直接给20个线程
//            ExecutorService executors = Executors.newFixedThreadPool(DownpMImage.threadSize);
//            for (Entity entity : query) {
//                executors.submit(() -> {
//                    Integer pmid = entity.getInt("pmid");
//                    String figure = entity.getStr("figure");
//                    if (StringUtils.isNotEmpty(figure) && !figure.equals("[]")) {
//                        JSONArray strings = JSONArray.parseArray(figure);
//                        List<String> urls = new LinkedList<>();
//                        for (Object string : strings) {
//                            JSONObject sin = (JSONObject) string;
//                            Set<String> strings1 = sin.keySet();
//                            String url = "";
//                            for (String s : strings1) {
//                                url = s;
//                            }
//                            // 进行下载
//                            urls.add(url);
//                        }
//                        // 预处理位置 进行分组放下
//                        String folderNameFront = pmid / 50000 + 1 + "";
//                        String folderNameLast = pmid / 50000 + 2 + "";
//                        String newPath = rootPath + folderNameFront + "-" + folderNameLast + "\\" + pmid + "\\";
//                        Map<String, Object> stringObjectMap = DownImage(urls, newPath);
//                        if (stringObjectMap.get("status").equals("success")) {
//                            entity.set("status", 1);
//                            entity.set("path", JSON.toJSONString(stringObjectMap.get("data")));
//                            Entity param = new Entity();
//                            param.setTableName(db);
//                            param.set("pmid", pmid);
//                            try {
//                                use.update(entity, param);
//                            } catch (SQLException throwables) {
//                                throwables.printStackTrace();
//                            }
//                        } else {
//                            entity.set("status", 2);
//                            Entity param = new Entity();
//                            param.setTableName(db);
//                            param.set("pmid", pmid);
//                            try {
//                                use.update(entity, param);
//                            } catch (SQLException throwables) {
//                                throwables.printStackTrace();
//                            }
//                        }
//                    } else {
//                        entity.set("status", 1);
//                        Entity param = new Entity();
//                        param.setTableName(db);
//                        param.set("pmid", pmid);
//                        try {
//                            use.update(entity, param);
//                        } catch (SQLException throwables) {
//                            throwables.printStackTrace();
//                        }
//                    }
//
//                });
//            }

//            executors.shutdown();
//            while (true) {
//                if (executors.isTerminated()) {
//                    
//                    break;
//                } else {
//                    SmallTool.printMess("等待中开始页码++" + i + "页++++++++++++++++");
//                    Thread.sleep(1200);
//
//                }
//            }


//            query.parallelStream().forEach(entity -> {
//
//            });
//            SmallTool.SleepMillis(10000L);
//            SmallTool.printMess("睡眠结束++++++++++++++++++");
        }
    }


//    @SneakyThrows
//    public static Map<String, Object> DownImage(List<String> url, String path) {
//        ExecutorService executorService = Executors.newFixedThreadPool(UrlEntity.coreThread);
//        List<Future<Map<String, Object>>> taskRes = new LinkedList<>();
//        Map<String, Object> resMap = new HashMap<>();
//        for (int i = 0; i < url.size(); i++) {
//            DoDown task = new DoDown(url.get(i), path);
//            FutureTask futureTask = new FutureTask<>(task);
//            taskRes.add(futureTask);
//            executorService.submit(futureTask);
//        }
//        executorService.shutdown();
//        while (true) {
//            if (executorService.isTerminated()) {
//                
//                break;
//            } else {
//                Thread.sleep(1200);
//               
//            }
//        }
//        List<Map<String, Object>> resList = new LinkedList<>();
//        for (Future<Map<String, Object>> taskRe : taskRes) {
//            resList.add(taskRe.get());
//        }
//        String res = "success";
//        List<String> resPath = new ArrayList<>();
//        T:
//        for (Map<String, Object> s : resList) {
//            Set<String> strings = s.keySet();
//            for (String string : strings) {
//                resPath.add(s.get(string).toString());
//                if (string.equals("faild")) {
//                    res = "faild";
//                    break T;
//                }
//            }
//        }
//        resMap.put("status", res);
//        SmallTool.printMess("当前url全部下载结果+"+res);;
//        resMap.put("data", resPath);
//        return resMap;
//    }
//
//    static class DoDown implements Callable {
//
//        public Map<String, Object> resMap = new HashMap<>();
//        private String url;
//        private String path;
//
//        public DoDown(String url, String path) {
//            this.url = url;
//            this.path = path;
//        }
//
//        @Override
//        public Object call() {
//            String fileName = StringUtil.getFileName(url);
//            String res = "success";
//            try {
//                HttpClientConfig config = HttpClientUtil.getSearConfig(url, "", "", true);
//                config.setProxy(false);
//                config.setDirPath(path);
//                config.setFilePath(fileName);
//                HttpClient.getDownImage(config);
//            } catch (Exception e) {
//                res = "faild";
//            }
//            resMap.put(res, path + fileName);
//            return resMap;
//        }
//    }


}
